#迭代器
#可迭代对象条件 1实现了__iter__()方法 2__iter__()方法返回了迭代器对象
#for循环工作原理 1通过iter方法获得可迭代对象的迭代器 2对获取的迭代器不断调用__next__()方法来获取下一个值,并赋值给临时变量
#isinstance(对象,类型) 判断是否为可迭代对象,或者是一个已知类型
#导入模块
from collections.abc import Iterable
print(isinstance([1,2,3], Iterable))
#迭代器是一个可以记住遍历位置的对象,相当于在上次停留的地方继续做一些事情
#iter() 获取可迭代对象的迭代器 调用对象的__iter__()方法
#next() 一个个取元素,取完后会引发一个异常 调用对象的__next__()方法
li = [1,2,3]
ili = iter(li)
# ili = li.__iter__() 效果一样
print(next(ili))
print(next(ili))
print(ili.__next__()) #效果一样
#可迭代对象(iterable)和迭代器(iterator)的区别  for循环能用的为可迭代对象 next()用的迭代器
#可迭代对象不一定为迭代器对象 迭代器对象一定是可迭代对象 可迭代>迭代器 dir()中有next的为迭代器
#迭代器协议,对象必须提供一个next方法,要么返回下一个数据,要么返回异常StopIteration
#自定义迭代器类 python没有这个类
#特性必须有 iter和next魔术方法
class A(object): #实现每次调用加1 这就算迭代器类,可以被迭代
    def __init__(self):
        self.count = 0
    def __iter__(self):
        return self
    def __next__(self):
        if self.count == 10:
            raise StopIteration
        self.count+=1
        return self.count
a = A()
print(a)
for i in a: #因为for循环原理就是调用iter和next魔术对象,所以当类有的时候,类也能迭代
    print(i)